<?php
namespace app\admin\validate;

use think\Db;

/**
 * 用户验证
 */
class Permission extends Main
{
    protected $rule = [
        'id' => 'require',
        'title' => 'require',
        'module' => 'require|checkAllValue',
        'controller' => 'require',
        'action' => 'require',
        'del' => 'require|checkDel'
    ];

    protected $message = [
        'id.require' => '请选择要编辑的权限',
        'title.require' => '请填写权限标题',
        'module.require' => '请填写模型',
        'controller.require' => '请填写控制器',
        'action.require' => '请填写方法',
    ];

    protected $scene = [
        'add' =>  ['title', 'module', 'controller', 'action'],
        'edit' => ['id', 'title', 'module', 'controller', 'action'],
        'del' => ['id', 'del']
    ];

    protected function checkAllValue($value, $rule, $data = [])
    {
        if(!in_array($value, ['admin', 'index'])){
            return '模型名称必须为admin或者index';
        }
        $check = false;
        try{
            $r = Db::query('desc '.config('database.prefix').$data['controller']);
            if($r){
                $check = true;
            }
        }catch(\Exception $e){
        }
        if(!$check){
            return '控制器必须是已存在的数据表名称';
        }
        if(!preg_match('/^'.$data['controller'].'(.*?)$/', $data['action'], $temp)){
            return '方法名称必须以控制器名称开头，加上List,Add,Del中的一种';
        }
        if(!in_array($temp[1], ['List', 'Add', 'Del'])){
            return '方法名称必须以控制器名称开头，加上List,Add,Del中的一种';
        }
        try{
            if($data['id']??''){
                $r = Db::name('permission')->where('module', $data['module'])
                    ->where('controller', $data['controller'])
                    ->where('action', $data['action'])
                    ->where('id', '<>', $data['id'])
                    ->find();
            }else{
                $r = Db::name('permission')->where('module', $data['module'])
                    ->where('controller', $data['controller'])
                    ->where('action', $data['action'])
                    ->find();
            }
            if($r){
                return '该权限已存在';
            }
        }catch(\Exception $e){
            return $e->getMessage();
        }
        return true;
    }

    protected function checkDel($value, $rule, $data = [])
    {
        //查询权限是否关联了角色
        $role = Db::name('role')->field('permission_ids')->select();
        foreach($role as $v){
            $temp = json_decode($v['permission_ids'], true);
            foreach($data['id'] as $v1){
                if(in_array($v1, $temp)){
                    return '权限已关联了角色，请先删除角色';
                }
            }
        }
        //查询权限是否关联了菜单
        $menu = Db::name('menu')->field('title')->where('permission_id', 'in', $data['id'])->find();
        if($menu){
            return '权限已关联了菜单，请先删除菜单';
        }
        return true;
    }
}